home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / RCS / sigvec.c,v < prev    next >
Text File  |  1992-01-31  |  6KB  |  273 lines

  1. head     1.4;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.4.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.4
  10. date     90.12.13.17.07.42;  author shirriff;  state Exp;
  11. branches 1.4.1.1;
  12. next     1.3;
  13.  
  14. 1.3
  15. date     89.06.15.12.54.46;  author ouster;  state Exp;
  16. branches ;
  17. next     1.2;
  18.  
  19. 1.2
  20. date     88.07.29.17.40.28;  author ouster;  state Exp;
  21. branches ;
  22. next     1.1;
  23.  
  24. 1.1
  25. date     88.06.19.14.32.01;  author ouster;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29. 1.4.1.1
  30. date     92.01.31.16.36.41;  author kupfer;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34.  
  35. desc
  36. @@
  37.  
  38.  
  39. 1.4
  40. log
  41. @Changed signal handlers to return more information.
  42. @
  43. text
  44. @/* 
  45.  * sigvec.c --
  46.  *
  47.  *    Procedure to map from Unix sigvec system call to Sprite.
  48.  *
  49.  *    Note: None of the special flags in the sigvec structure is supported
  50.  *    as yet. Eventually we could support the signal stack, if we're kludgey,
  51.  *    the interruption, if we use the raw Sprite system calls for the
  52.  *    emulation, and the reset handler (Sun UNIX only) bits if desired.
  53.  *
  54.  *    Note further: many Unix signals are not supported under Sprite.
  55.  *
  56.  * Copyright (C) 1986 Regents of the University of California
  57.  * All rights reserved.
  58.  */
  59.  
  60. #ifndef lint
  61. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/sigvec.c,v 1.3 89/06/15 12:54:46 ouster Exp $ SPRITE (Berkeley)";
  62. #endif not lint
  63.  
  64. #include "sprite.h"
  65. #include "sig.h"
  66.  
  67. #include "compatInt.h"
  68. #include <signal.h>
  69. #include <errno.h>
  70.  
  71. /*
  72.  * Array of signal handlers for UNIX signals. Need the extra indirection
  73.  * to provide the proper UNIX signal number to the handler, since it may
  74.  * decide what to do based on that number...We'll worry about codes later.
  75.  */
  76. void    (*unixHandlers[NSIG])();
  77.  
  78. /*
  79.  *----------------------------------------------------------------------
  80.  *
  81.  * unixHandleSig --
  82.  *
  83.  *    Procedure to handle the receipt of a Sprite signal. Maps the
  84.  *    Sprite signal to a UNIX signal and calls the right handler.
  85.  *
  86.  * Results:
  87.  *    None.
  88.  *
  89.  * Side effects:
  90.  *    The signal handler for the UNIX signal is called. Note that since
  91.  *    several UNIX signals may map to the same Sprite signal, there
  92.  *    will be problems if different functions are given for the 
  93.  *    overlapping signals.
  94.  *
  95.  *----------------------------------------------------------------------
  96.  */
  97.     /* ARGSUSED */
  98.  
  99. static
  100. unixHandleSig (spriteSig, spriteCode, sigContext, sigAddr)
  101.     int        spriteSig;    /* Sprite signal being delivered */
  102.     int        spriteCode;    /* Sub code of signal */
  103.  
  104.     struct sigcontext *sigContext;    /* Context of signal. */
  105.     char    *sigAddr;    /* Address of fault. */
  106. {
  107.     int        unixSig;    /* "Equivalent" UNIX signal */
  108.     
  109.     if ((Compat_SpriteSignalToUnix (spriteSig, &unixSig) == SUCCESS) &&
  110.     (unixHandlers[unixSig] != (void (*)()) NULL)) {
  111.         /*
  112.          * XXX: Should decode spriteCode and pass sigcontext *
  113.          */
  114.         (* unixHandlers[unixSig]) (unixSig, spriteCode, sigContext,
  115.             sigAddr);
  116.     }
  117.     /*
  118.      * XXX: Should warn about bogus signal handler, yes?
  119.      */
  120. }
  121.  
  122.  
  123. /*
  124.  *----------------------------------------------------------------------
  125.  *
  126.  * sigvec --
  127.  *
  128.  *    Procedure to map from Unix sigvec system call to Sprite Sig_SetAction.
  129.  *
  130.  * Results:
  131.  *    UNIX_ERROR is returned upon error, with the actual error code
  132.  *    stored in errno.  Upon success 0 is returned.
  133.  *
  134.  * Side effects:
  135.  *    The signal handler associated with the specified signal is modified.
  136.  *
  137.  *----------------------------------------------------------------------
  138.  */
  139. int
  140. sigvec(sig, newVectorPtr, oldVectorPtr)
  141.     int         sig;        /* Signal to set the vector for. */
  142.     struct sigvec    *newVectorPtr;    /* New vector. */
  143.     struct sigvec    *oldVectorPtr;    /* Old vector. */
  144. {
  145.     int         spriteSignal;    /* Equivalent signal for Sprite */
  146.     Sig_Action         newAction;    /* Action to take */
  147.     Sig_Action         oldAction;    /* Former action */
  148.     ReturnStatus     status;        /* Generic result code */
  149.     void              (*handler)();    /* New handler for UNIX signal */
  150.  
  151.     status = Compat_UnixSignalToSprite(sig, &spriteSignal);
  152.     if (status == FAILURE || spriteSignal == NULL) {
  153.     errno = EINVAL;
  154.     return(UNIX_ERROR);
  155.     }
  156.     handler = (void (*)()) NULL;
  157.  
  158.     if (newVectorPtr != (struct sigvec *)NULL) {
  159.     switch ((int)newVectorPtr->sv_handler) {
  160.         case SIG_DFL:
  161.         newAction.action = SIG_DEFAULT_ACTION;
  162.         break;
  163.         case SIG_IGN:
  164.         newAction.action = SIG_IGNORE_ACTION;
  165.         break;
  166.         default:
  167.         newAction.action = SIG_HANDLE_ACTION;
  168.         newAction.handler = unixHandleSig;
  169.         handler = newVectorPtr->sv_handler;
  170.     }
  171.     status = Compat_UnixSigMaskToSprite(newVectorPtr->sv_mask,
  172.                         &newAction.sigHoldMask);
  173.     if (status == FAILURE) {
  174.         errno = EINVAL;
  175.         return(UNIX_ERROR);
  176.     }
  177.  
  178.     status = Sig_SetAction(spriteSignal, &newAction, &oldAction);
  179.     if (status != SUCCESS) {
  180.         errno = Compat_MapCode(status);
  181.         return(UNIX_ERROR);
  182.     } 
  183.     }
  184.  
  185.     if (oldVectorPtr != NULL) {
  186.     switch (oldAction.action) {
  187.         case SIG_DEFAULT_ACTION:
  188.         oldVectorPtr->sv_handler = SIG_DFL;
  189.         break;
  190.         case SIG_IGNORE_ACTION:
  191.         oldVectorPtr->sv_handler = SIG_IGN;
  192.         break;
  193.         default:
  194.         oldVectorPtr->sv_handler = unixHandlers[sig];
  195.         break;
  196.     }
  197.     (void) Compat_SpriteSigMaskToUnix(oldAction.sigHoldMask, 
  198.                       &oldVectorPtr->sv_mask);
  199.     oldVectorPtr->sv_flags = 0;
  200.     }
  201.  
  202.     if (newVectorPtr != NULL) {
  203.     unixHandlers[sig] = handler;
  204.     }
  205.  
  206.     return(UNIX_SUCCESS);
  207. }
  208. @
  209.  
  210.  
  211. 1.4.1.1
  212. log
  213. @Initial branch for Sprite server.
  214. @
  215. text
  216. @d18 1
  217. a18 1
  218. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/sigvec.c,v 1.4 90/12/13 17:07:42 shirriff Exp $ SPRITE (Berkeley)";
  219. @
  220.  
  221.  
  222. 1.3
  223. log
  224. @Make signal handlers return void instead of int.
  225. @
  226. text
  227. @d18 1
  228. a18 1
  229. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/sigvec.c,v 1.2 88/07/29 17:40:28 ouster Exp Locker: ouster $ SPRITE (Berkeley)";
  230. d57 1
  231. a57 1
  232. unixHandleSig (spriteSig, spriteCode)
  233. d60 3
  234. d71 2
  235. a72 1
  236.         (* unixHandlers[unixSig]) (unixSig, 0);
  237. @
  238.  
  239.  
  240. 1.2
  241. log
  242. @Lint.
  243. @
  244. text
  245. @d18 1
  246. a18 1
  247. static char rcsid[] = "$Header: sigvec.c,v 1.1 88/06/19 14:32:01 ouster Exp $ SPRITE (Berkeley)";
  248. d33 1
  249. a33 1
  250. int    (*unixHandlers[NSIG])();
  251. d64 1
  252. a64 1
  253.     (unixHandlers[unixSig] != (int (*)()) NULL)) {
  254. d102 1
  255. a102 1
  256.     int                  (*handler)();    /* New handler for UNIX signal */
  257. d109 1
  258. a109 1
  259.     handler = (int (*)()) NULL;
  260. @
  261.  
  262.  
  263. 1.1
  264. log
  265. @Initial revision
  266. @
  267. text
  268. @d18 1
  269. a18 1
  270. static char rcsid[] = "$Header: sigvec.c,v 1.2 88/01/07 11:58:02 deboor Exp $ SPRITE (Berkeley)";
  271. d54 2
  272. @
  273.